package com.wyg.lambda.interfaces;

/**
 * 注解：@FunctionalInterface 表示该接口为函数式接口：
 *
 * JDK1.8之前的函数式接口举例：
 *
 *      1.java.lang.Runnable
 *      2.java.util.concurrent.Callable<V>
 *      3.java.util.Comparator<T>
 *
 * JDK1.8提供的函数式接口： 位置rt.jar -> java.util.function包下
 *      1.java.util.function.Supplier<T>  代表输出
 *
 *      2.java.util.function.Consumer<T>  代表输入
 *      3.java.util.function.BiConsumer<T, U>  代表两个输入
 *
 *      4.java.util.function.Function<T, R>  代表一个输入，一个输出（一般表示输入和输出是【不同类型】的）
 *      5.java.util.function.UnaryOperator<T> extends Function<T, T>  代表一个输入，一个输出(输入和输出是【相同类型】的)
 *
 *      6.java.util.function.BiFunction<T, U, R> 代表两个输入，一个输出（一般表示输入和输出是【不同类型】的）
 *      7.java.util.function.BinaryOperator<T> extends BiFunction<T,T,T>  代表两个输入，一个输出(输入和输出是【相同类型】的)
 *
 * 可以知道这个注解有以下特点：
 *
 *      1、该注解只能标记在"有且仅有一个抽象方法"的接口上。
 *      2、JDK8接口中的静态方法和默认方法，都不算是抽象方法。
 *      3、接口默认继承java.lang.Object，所以如果接口显示声明覆盖了Object中方法，那么也不算抽象方法。
 *      4、该注解不是必须的，如果一个接口符合"函数式接口"定义，那么加不加该注解都没有影响。
 *          加上该注解能够更好地让编译器进行检查。
 *          如果编写的不是函数式接口，但是加上了@FunctionInterface，那么编译器会报错。
 *
 * @ClassName: UserMapper
 * @Auther: WangYG
 * @Date: 2020-02-19 19:15:32
 * @Version: 1.0
 */
@FunctionalInterface
public interface UserMapper {
    /**
     * 唯一的抽象方法
     * @return
     */
    int insert();

    /**
     * 模拟Object类中的hashCode()方法，不算做抽象方法。
     * @return
     */
    public int hashCode();

    /**
     * default 方法也不算做抽象方法
     * @return
     */
    default int one(){
        return 1;
    }

    /**
     * static 方法也不算做抽象方法
     * @return
     */
    static int two(){
        return 1;
    }
}
